 //函数指针数组
 //int (*ptr[5])（int x, ing y);


// 用函数指针数组写一个计算器


#include <stdio.h>

int Add(int x, int y)
{
    return x+y;
}
int Sub(int x, int y)
{
    return x-y;
}
int Mul(int x, int y)
{
    return x*y;
}
int Div(int x, int y)
{
    return x/y;
}
void menu()
{
    printf("==== Calculator Menu ====\n");
    printf("  1. Add           2. Sub\n"); //+ -
    printf("  3. Mul           4. Div\n"); //* /
    printf("  0. Exit\n");
    printf("=========================\n");
    printf("请选择:>");
}
int calculator(int chose, int x, int y)
{
    int ret = 0;
    //定义函数指针数组
    int (*cal[5])(int x, int y) = {0, Add, Sub, Mul, Div};//
    ret = cal[chose](x, y); 
    return ret; 
}
void calculator_test()
{
    int input = 0;
    int x = 0;
    int y = 0;
    int ret = 0;
    do
    {
        menu();
        while(scanf("%d", &input) != 1);
        if(input >=1 && input <=4)
        {
            printf("请输入操作数:>");
            while(scanf("%d %d", &x, &y) != 2);
            ret = calculator(input, x, y);
            printf("ret = %d\n", ret);
        }
        else if(input == 0)
        {
            printf("退出计算器\n");
        }
        else
        {
            printf("选择错误\n");
        }
    }while(input);
}
int main1()
{
    calculator_test();
    return 0;
}

/*
写一个函数打印arr数组的内容，不使用数组下标，使用指针。
arr是一个整形一维数组。
*/

void Print(int* arr, int len)
{
    int i = 0;
    for(i = 0; i < len; i++)
    {
        printf("%d ", *(arr+i));
    }
    printf("\n");
}
int main2()
{
    int arr[5] = {1, 2, 3, 4, 5};
    Print(arr, 5);
    return 0;
}

/*
求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和，其中a是一个数字，
例如：2+22+222+2222+22222
*/
//2 = 
//a1 = 2; a2 = a1*10+2
//22 = 2+ 2 x 10
//222 = 
int fun(int a)
{
    int a1 = a;
    int sn = 0;
    int i = 0;
    for(i = 1; i <=5; i++)
    {
        sn = sn + a1;
        a1 = a1 * 10 + a;
    }

    return sn;
}
int main3()
{
    int a = 2;
    int Sn = fun(a);
    printf("%d\n",Sn);
    printf("%d\n", 2+22+222+2222+22222);
    return 0;
}

/*
求出0～100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数，其各位数字的n次方之和确好等于该数本身，
如:153＝1^3＋5^3＋3^3，则153是一个“水仙花数”。
*/
#include <math.h>
int is_narcissistic_number(int n)
{
    int n_bak = n;
    int digits = 0; //存放位数
    //计算位数
    int num = n_bak;
    while(num)
    {
        num /= 10;
        digits++;
    }
    num = n_bak; //恢复n
    //计算各个位数的次方和
    //243 
    int sum = 0;
    while(num)
    {
        int num_n = num % 10; //取出个位
        sum += pow(num_n, digits);
        num /= 10;
    }

    if (sum == n)
        return 1;
    else
        return 0;
}
int main4()
{
    int i = 0;
    for(i = 0 ; i <= 100000; i++)
    {
        if(is_narcissistic_number(i))
            printf("%d ", i);
    }
    printf("\n");
    return 0;
}


void test()
{
    int i ,j;
    for(i = 0; i < 5; i++)
    {
        for(j = 0; j < 5; j++)
        {
            printf("%d%d  ",i,j);
        }
        printf("\n");
    }
}


/*
链接：https://www.nowcoder.com/questionTerminal/cc57022cb4194697ac30bcb566aeb47b?answerType=1&f=discussion
来源：牛客网
将一个字符串str的内容颠倒过来，并输出。
1≤len(str)≤10000 
输入描述:
输入一个字符串，可以有空格
输出描述:
输出逆序的字符串
*/
#include <stdio.h>
#include <string.h>
void reverse(char* str)
{
    //hello len=5 right = str+4
    int len = strlen(str);
    char* left = str;
    char* right = str+len-1;
    while(left < right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;

        left++;
        right--;
    }
}
int main5() {
    char str[10001] = {0};
    while(gets(str))
    {
        reverse(str);
        printf("%s\n", str);
        //memset(str, 0, sizeof(str)/sizeof(str[0]));
    }
    return 0;
}

//打印13x13的菱形

//菱形分为上半部分和下半部分
//上半部分分为上三角的空格 和 *
//上半部分 一开始为 7 - 1 = 6个空格，每减少一个减少一行
//* 是 1 3 5 7 9 11 13个
//  行号1 2 3 4 5 6 7
//行号line*2-1



//line = 7
void Print_test(int line)
{
    int i = 0;
    for(i = 1; i <= line; i++)
    {
        //每一行

        //' '
        int j = 1;
        for(j = 1; j <= line-i; j++)
        {
            printf(" ");
        }
        
        ///'*' 
        for(j = 1; j <= i*2 - 1; j++)
        {
            printf("*");
        }
        printf("\n");
    }

    //下三角
    //7 -1 行 line -1
    //“ ” 1 2 3 4
    //  行1 2 3 4
    //“*” 11 9 7 5 3 1
    //行号 1  2 3 4 5 6
    //  2*6-1 6 = 7 -1  == 2*（line-i）- 1
    for(i = 1; i <= line - 1; i++)
    {
        int j = 0;
        for(j = 1; j <= i; j++)
        {
            printf(" ");
        }
        for(j = 1; j <= 2*(line-i)-1; j++)
        {
            printf("*");
        }
        printf("\n");
    }
}
int main()
{
    int line = 0;
    scanf("%d", &line);
    Print_test(line);
}

